package key

import (
	"fmt"
	"reflect"
)

type Student struct {
	Name string
	Age  int
}

type Teacher struct {
	Name string
	Age  int
}

func AccessKey() {
	// var num int = 100
	// reflectTest01(num)

	/*stu := &Student{
		Name: "venki.chen",
		Age:  28,
	}
	reflectTest02(stu)*/

	reflectTest03()
}

func reflectTest03()  {

}

func reflectTest02(r interface{}) {
	// 获取reflect.Type
	rType := reflect.TypeOf(r)
	fmt.Printf("rType=%v，rTypeType=%T\n", rType, rType)

	// 获取reflect.Value
	rValue := reflect.ValueOf(r)
	fmt.Println("rValue=", rValue)
	fmt.Printf("rValue=%v，rValueType=%T\n", rValue, rValue)

	// 将reflect.Value转换成功interface{}
	iV := rValue.Interface()
	fmt.Printf("iV=%v,iVType=%T\n", iV, iV)

	// 类型断言
	/*switch r.(type) {

	}*/
	stu, ok := iV.(*Student) // 因为我传入的是指针类型，所以断言时也应该是指针类型
	if ok {
		fmt.Printf("stu.Name=%v\n", stu.Name)
	}
}

func reflectTest01(r interface{}) {
	// 获取reflect.Type
	rType := reflect.TypeOf(r)
	fmt.Printf("rType=%v，rTypeType=%T\n", rType, rType)

	// 获取reflect.Value
	rValue := reflect.ValueOf(r)
	fmt.Println("rValue=", rValue)
	fmt.Printf("rValue=%v，rValueType=%T\n", rValue, rValue)

	// 获取真正传入进去的值
	realValue := rValue.Int()
	fmt.Printf("realValue=%v,realValueType=%T\n", realValue, realValue)

	// 将reflect.Value转换成功interface{}
	iV := rValue.Interface()

	// 将interface转换成需要的类型
	num1 := iV.(int)
	fmt.Printf("num1=%v,num1Type=%T\n", num1, num1)
}
